package internet_project.Server;

import internet_project.Manage.manage_InputSocket_Thread_Utility;
import internet_project.common.Message;
import internet_project.common.MessageType;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Connect_Client_Socket_Thread extends Thread {
  String uesrid;//谨慎点

  // 一直保持通信的线程必须持有与客户端相关联的socket
  Socket socket;

  public Connect_Client_Socket_Thread(String User_id, Socket socket) {
    this.uesrid = User_id;
    this.socket = socket;
  }

  @Override
  public void run() {
    try {
      while (true) {
        System.out.println("服务器与客户端用户" + uesrid + "保持通信");
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        Message mess = (Message) ois.readObject();//如果没有信息发送过来 ，循环会阻塞在这里，一直等待读取mess对象

        if (mess.getType().equals(MessageType.GET_USER_LIST)) {  // 用户 请求 在 线 用户 列表

          System.out.println(mess.getSend_user() + "想要在线用户列表");

          //将所有用户拿到
          HashMap<String, Connect_Client_Socket_Thread> hm = manage_InputSocket_Thread_Utility.getHM();//拿到 管理所有 用户的集合
          Set<String> users = hm.keySet();
          Iterator<String> iterator = users.iterator();
          String userlist = "";
          while (iterator.hasNext()) {//拼接所有的用户名
            userlist += iterator.next() + "-";

          }

          Message message = new Message();
          message.setType(MessageType.RET_USER_LIST);
          message.setContent(userlist);

          // 将信息发送
          ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
          oos.writeObject(message);
        }

        // 用户 想要 私聊 的情况
        if (mess.getType().equals(MessageType.MESSAGE)) {

          // 取出 内容 发送者 接收者
          String send_user = mess.getSend_user();
          String receive_user = mess.getReceive_user();
          String content = mess.getContent();
          System.out.println("用户" + send_user + "想对用户" + receive_user + "说：" + content);

          // 构建 一个 好的 信息对象

          Message message = new Message();
          message.setType(MessageType.MESSAGE);
          message.setContent(content);
          message.setSend_user(send_user);

          // 从集合 里找 有 没 有 这 个  用户
          Connect_Client_Socket_Thread ccst = manage_InputSocket_Thread_Utility.getClient_socket(receive_user);
//          说明 用户 存在
          if (ccst != null) {//  拿到 关联 的 socket 发送 信息
            ObjectOutputStream oos = new ObjectOutputStream(ccst.socket.getOutputStream());
            oos.writeObject(message);

            // 告诉 发送方 信息 发送 成功
            Message mess_send_ok = new Message();
            mess_send_ok.setType(MessageType.SEND_MESSAGE_ISOK);
            mess_send_ok.setContent("发送成功");

            oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(mess_send_ok);
          } else {
            // 否则 发送 失败
            ObjectOutputStream oos;
            Message mess_send_ok = new Message();
            mess_send_ok.setType(MessageType.SEND_MESSAGE_ISOK);
            mess_send_ok.setContent("发送失败！！！");
            oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(mess_send_ok);
          }

        }

        if (mess.getType().equals(MessageType.SEND_MESSAGE_ALLPERSON)) {
          HashMap<String, Connect_Client_Socket_Thread> hm = manage_InputSocket_Thread_Utility.getHM();
          // 取出所有的values 排除 自己
          Iterator<Connect_Client_Socket_Thread> ccsts = hm.values().iterator();
          while (ccsts.hasNext()) {
            // 把 监听 客户 端 的 线程 全部取出来
            Connect_Client_Socket_Thread ccst = ccsts.next();
            if (ccst != this) { //不要等于 当前 对象
              //拿 别人 的socket 发 自己 的 消息
              ObjectOutputStream oos = new ObjectOutputStream(ccst.socket.getOutputStream());
              oos.writeObject(mess);

            }
          }
        }

        if (mess.getType().equals(MessageType.EXIT)) {
          // 把 自己 从 服务 器 的 集合 拿掉
          System.out.println(mess.getSend_user() + "与服务端断开连接！！！！！");
          manage_InputSocket_Thread_Utility.remove(mess.getSend_user());

          //这个 break 会 结束 whlie 循环 意味着  该线程 结束退出
          break;
        }

        if (mess.getType().equals(MessageType.FILE_SEND)) {
          // 要干吗?
          // 遍历 要发送的用户的socket的 拿到他的socket写进去
          System.out.println(mess.getSend_user()+"给"+mess.getGet_user()+"发送文件");
          OutputStream outputStream = manage_InputSocket_Thread_Utility.getClient_socket(mess.getGet_user()).socket.getOutputStream();
          ObjectOutputStream oos = new ObjectOutputStream(outputStream);
          oos.writeObject(mess);

        }

      }
    } catch (Exception e) {
      e.printStackTrace();
    }

  }
}
